![DynamoDBに登録するデータをスプレッドシートで一括作成する](https://devio2023-media.developers.io/wp-content/uploads/2019/05/amazon-dynamodb.png)
DynamoDBに登録するデータをスプレッドシートで一括作成する
データアナリティクス事業本部、池田です。
7月に入社以来、一番触っている技術(?)はGoogle スプレッドシートとExcelでした。
ヨソウガイデス…(嫌な訳ではありません。)
最近はチームでの自分の役割を説明する時に「スプレッドシートとExcel担当です。」って言ってます。
そんな訳で、この夏のスプレッドシートの思い出の中で、
Amazon DynamoDBへの一括登録用のデータ作成を紹介します。
スプレッドシートでデータを生成する
スプレッドシートに登録したいデータを記入して、関数でJSONに整形します。
Python(Boto3)で登録するために、JSONは以下の形式にしておきます。
{ "RequestItems": { "{テーブル名}": [ { "PutRequest": { "Item": { "{登録するKey1}": "{登録するValue1}", "{登録するKey2}": "{登録するValue2}" } } }, { "PutRequest": { "Item": "{次のアイテムのKey-Value情報}" } } ] } }
RequestItemsキーとテーブル名のキーは登録処理のスクリプトで後付けするので、 スプレッドシートではPutRequest群の配列部分までを、関数で作成します。
今回はサンプルデータとして、弊社 岩本町オフィス の近辺の駅とその隣接する3駅の情報を使用しています。
- A2計算式:
=IF(ROW()=2,"[","")&"{""PutRequest"":{""Item"":{""id"":"""&B2&""",""name"":"""&C2&""",""line"":"""&D2&""",""destinations"":["&E2&"],""msg"":"""&F2&"""}}}"&IF(ROW()=COUNTA(B:B),"]",",")
A列をコピーして、エディタなどで整形した結果のJSONが以下です。
クリックでコードを表示する/折りたたむ
[ { "PutRequest": { "Item": { "id": "S-08", "name": "岩本町", "line": "都営新宿線", "destinations": ["小川町", "神保町", "九段下"], "msg": "{env}のアイテムです。" } } }, { "PutRequest": { "Item": { "id": "JK27", "name": "神田", "line": "京浜東北線", "destinations": ["秋葉原", "御徒町", "上野"], "msg": "{env}のアイテムです。" } } }, { "PutRequest": { "Item": { "id": "JY02", "name": "神田", "line": "山手線", "destinations": ["秋葉原", "御徒町", "上野"], "msg": "{env}のアイテムです。" } } }, { "PutRequest": { "Item": { "id": "JC02", "name": "神田", "line": "中央線", "destinations": ["御茶ノ水", "水道橋", "飯田橋"], "msg": "{env}のアイテムです。" } } }, { "PutRequest": { "Item": { "id": "G-13", "name": "神田", "line": "銀座線", "destinations": ["三越前", "日本橋", "京橋"], "msg": "{env}のアイテムです。" } } }, { "PutRequest": { "Item": { "id": "A-15", "name": "東日本橋", "line": "都営浅草線", "destinations": ["人形町", "日本橋", "宝町"], "msg": "{env}のアイテムです。" } } }, { "PutRequest": { "Item": { "id": "JO21", "name": "馬喰町", "line": "総武快速線", "destinations": ["新日本橋", "東京", "新橋"], "msg": "{env}のアイテムです。" } } }, { "PutRequest": { "Item": { "id": "H-14", "name": "小伝馬町", "line": "日比谷線", "destinations": ["人形町", "茅場町", "八丁堀"], "msg": "{env}のアイテムです。" } } } ]
取って付けた感満載の msg
というキーは、登録処理のスクリプトで {env}
の部分を置換する例です。
開発や本番などの環境(env)ごとに登録する値を変更することを想定しています。
数値をValueとして登録したい場合は、「""」で括ってしまわないよう注意が必要です。
DynamoDBへ一括登録するPythonスクリプト
Pythonで登録を行います。
- 今回のスクリプトではテーブルの作成はしないので、予め作成しておきます。
プライマリキー(今回ならid
)だけ設定しておけば他のキーはデータの登録時に追加されます。 - 以下のスクリプトで一括登録します。
- 引数
- 環境名(コード内の
replace_lists
変数に設定しているキー) - DynamoDBテーブル名
- インプットファイル(前章で作成したもの)
- 環境名(コード内の
- 起動例:
python create_dynamodb_items.py dev my_table1 sample_data.json
Boto3でbatch_write_itemを使用して登録を行います。 一度に登録できるのは25アイテムまでのようなので、25個ごとに登録をしています。 (batch_write_itemについては こちらに別の記事 がありました。)
replace_lists
変数に、インプットファイル名(sample_data.json)>置換したい文字列(env)>環境名(dev/prod)
という階層で置換後の文字列を設定しています。
登録結果
このように登録されています。
今回は実行時の引数の環境名に dev
を指定しているので、
スプレッドシートでは {env}
にしていた部分が、 開発環境
という文字列に置換され登録されています。
おわりに
key-value型のデータベースは初めて利用しました。 アプリのパラメータの管理に使っているのですが、便利ですね。
ちなみに、一括削除したい時は こちらの記事 のスクリプトを使用しています。